from django.shortcuts import render

# Create your views here.
from django_redis import get_redis_connection
from rest_framework.response import Response
from rest_framework.views import APIView

from order.models import OrderInfo
from pay.models import Payment

"""
沙箱环境接口联调
在沙箱支持产品列表中的所有产品接口均已开通权限，开发者只需配置以下信息即可联调接口：

1、沙箱appid
2、沙箱网关
我们需要组织2套公钥和私钥
    一套是支付宝的，另外一个是我们自己应用程序的
    3、沙箱应用私钥（我们自己的）
        私钥：放在我们的程序中
        公钥：放在支付宝的网站上
    4、沙箱支付宝公钥（支付宝）
        私钥：放在支付宝的服务器上
        公钥：放在支付宝的网站上，我们需要拷贝下来，放在我们的程序中

"""
"""
当用户点击去支付的时候，需要让前端将订单id传递给后端

1、后端接收订单id
2、根据订单id进行订单信息的查询
3、创建支付宝实例对象
4、生成order_string
5、拼接支付url

get /orders/(?P<order_id>\d+)/payment/

"""
from rest_framework.permissions import IsAuthenticated
from rest_framework import status

class PaymentAPIView(APIView):

    permission_classes = [IsAuthenticated]

    def get(self,request,order_id):
        # 1、后端接收订单id
        # 2、根据订单id进行订单信息的查询
        try:
            # 为了确保查询的更准确，我们需要添加几个查询条件
            order = OrderInfo.objects.get(order_id=order_id,
                                          user=request.user,
                                          status=OrderInfo.ORDER_STATUS_ENUM['UNPAID'])
        except OrderInfo.DoesNotExist:
            return Response(status=status.HTTP_400_BAD_REQUEST)
        # 3、创建支付宝实例对象
        from alipay import AliPay
        from meiduo_mall import settings
        app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read()
        alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read()

        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  #默认回调url
            app_private_key_string=app_private_key_string,
            # 支付宝的公钥，验证支付宝回传消息使用，不是你自己的公钥
            alipay_public_key_string=alipay_public_key_string,
            sign_type="RSA2",
            debug=settings.ALIPAY_DEBUG    #默认False
        )
        subject = '测试订单'
        # 4、生成order_string
        order_string = alipay.api_alipay_trade_page_pay(
            out_trade_no=order_id,
            total_amount=str(order.total_amount),  #货币类型要转换为str
            subject=subject,
            return_url="http://www.meiduo.site:8080/pay_seccess.html"
        )
        # 5、拼接支付url
        alipay_url = settings.ALIPAY_URL + '?' + order_string

        return Response({'alipay_url':alipay_url})



"""
当支付成功之后，需要让前端将回调的参数以查询字符串的形式返回回来

# 1、接收查询字符串参数
# 2、根据支付宝文档进行数据的验证
# 3、如果验证成功则获取 支付宝流水号和订单id
# 4、将支付宝流水号和订单拿id保存起来
# 5、更新订单状态

put    pay/status/?xxx=xxx

"""
class PayStatuAPIVIew(APIView):

    def put(self,request):
        # 1、接收查询字符串参数
        data = request.query_params.dict()
        # 2、根据支付宝文档进行数据的验证
        # sign 不能参与签名验证
        signature = data.pop("sign")
        from alipay import AliPay
        from meiduo_mall import settings
        app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read()
        alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read()

        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,   # 默认回调
            app_private_key_string=app_private_key_string,
            # 支付宝的公钥，验证支付宝回传信息使用，不是你自己的公钥
            alipay_public_key_string=alipay_public_key_string,
            sign_type="RSA2",
            debug=settings.ALIPAY_DEBUG
        )
        seccess = alipay.verify(data,signature)
        # 3、如果验证成功则获取 支付宝流水号和订单id
        """
        trade_no	String	必填	64	支付宝交易号	2013112011001004330000121536
        out_trade_no	String	必填	64	商户订单号	6823789339978248

        """
        trade_no = data.get('trade_no')
        out_trade_no = data.get('out_trade_no')
        # 4、将支付宝流水号和订单拿id保存起来
        Payment.objects.create(
            order_id = out_trade_no,
            trade_id=trade_no
        )
        # 5、更新订单状态
        OrderInfo.objects.filter(order_id=out_trade_no).update(status=OrderInfo.ORDER_STATUS_ENUM['UNSEND'])

        return Response({'trade_id':trade_no})

























































